package br.com.serctam.session;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Date;

import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.persistence.HibernateSessionProxy;

import br.com.serctam.entity.Candidato;
import br.com.serctam.entity.RetornoBB;

@Stateful
@Name("arqRetornoBB")
public class ArqRetornoBBBean implements ArqRetornoBB
{
    @Logger private Log log;

    @In StatusMessages statusMessages;
    
    @In
    private EntityManager entityManager;
    
    @In(required=true, create=true)
    private RetornoBB retornoBB;
    
    @In
    private GeradorNumeroInscricao geradorNumeroInscricao;

    @In
    private MailMessages mailMessages;

    
    @Out(required=false)
    public ArrayList<Candidato> candidatosAtualizados;
    
    @In
    private HibernateSessionProxy hibernateSession;

//    private byte[] arquivo;

    
    public void enviarMail()
    {
    	Criteria crt = hibernateSession.createCriteria(Candidato.class);
		crt.add(Restrictions.eq("mailPgEnviado", Boolean.FALSE));
		ArrayList<Candidato> candidatos = (ArrayList<Candidato>) crt.list();
		
		for (Candidato _candidato : candidatos) {
			mailMessages.enviarConfirmacaoRecebimentoPagamento(_candidato);
			_candidato.setMailPgEnviado(Boolean.TRUE);
			hibernateSession.merge(_candidato);
		}

    	
    }

    public void enviar()
    {
        // implement your business logic here
        //log.info("arqRetornoBB.arqRetornoBB() action called with: #{arqRetornoBB.value}");
        //log.info("arqRetornoBB.arqRetornoBB() action called with: " + arquivo.length);
        //statusMessages.add("arqRetornoBB #{arqRetornoBB}");
        
        
        ByteArrayInputStream stream = new ByteArrayInputStream(retornoBB.getData());
        int c;
        StringBuffer bf = new StringBuffer();
        
        ArrayList<String> linhas = new ArrayList<String>();
        
        while ((c = stream.read()) != -1 ) {
//        	log.info(((char)c) + " - "+ c);
        	bf.append((char)c);
        	
        	if(c==10){
        		linhas.add(new String(bf));
        		bf.setLength(0);
        	}
			
		}
        
       candidatosAtualizados = new ArrayList<Candidato>(0);
        
        int i = 0;
        for (String string : linhas) {
        	if (string.subSequence(7, 8).equals("3") && string.subSequence(13,14).equals("T") && string.subSequence(0, 3).equals("001") && string.subSequence(37,44).equals("2329097") ){
             	log.info( "N N:" + string.subSequence(37,57) + " VALOR" + string.subSequence(81,96)) ;
             	log.info( "Nosso:" + string.subSequence(44,54));
             	String nossoNumero = (String) string.subSequence(44,54);
             	//atualizaStatusCandidato(nossoNumero);
             	Candidato _candidato = buscaCandidato(nossoNumero);
             	_candidato.setValorPago(string.subSequence(81,96).toString());
             	candidatosAtualizados.add(_candidato);
             	log.info( "Cov:" + string.subSequence(37,44));
             	

        	}
		}
        
        gravarArquivoBD();
        for (Candidato _c : candidatosAtualizados) {
        	if(_c.getNumeroInscricao() == null){
        		atualizaStatusCandidato(_c);
        	}
		}
        hibernateSession.flush();
//        for (Candidato _c : candidatosAtualizados) {
//        	mailMessages.enviarConfirmacaoRecebimentoPagamento(_c);
//        }
        
        
        
//        atualizaStatusCandidato(string.subSequence(44,54));
//        log.info("(deve ser 0) Stringbuffer Legth: " + bf.length());
//        log.info("(deve estar vazio) Stringbuffer: " + bf);
//        log.info("ID Arquivo:" + retornoBB.getId());
        
        
    }
    
    public Candidato buscaCandidato(String nossoNumero){
    	

    	Long candidatoId =  new Long(nossoNumero);
    	Candidato candidato = (Candidato)hibernateSession.get(Candidato.class, candidatoId);
    	
    	
    	//Alterado para consulta atachada acima
//    	String hql = " select new Candidato( c.id , c.nome , c.cpf, c.dataNascimento, c.statusPagamento, c2.id ) from Candidato c inner join c.cargo c2 where c.nossoNumero =  :nossoNumero ";
//    	Query query = hibernateSession.createQuery(hql);
//    	query.setString("nossoNumero", nossoNumero);
//    	Candidato candidato = (Candidato)query.uniqueResult();
    	
    	return candidato;
    	
    }
    
    public void atualizaStatusCandidato(Candidato candidato) {

    	Integer numeroInscricao = geradorNumeroInscricao.nextVal(candidato.getCargo());
    	candidato.setStatusPagamento("PG");
    	candidato.setRetornoBB(retornoBB);
    	candidato.setNumeroInscricao(numeroInscricao.toString());
    	
    	
//    	Integer numeroInscricao = geradorNumeroInscricao.nextVal(candidato.getCargo());
//        String hql = "update Candidato set statuspagamento = 'PG' , retornobb_id = :retornobb_id , numeroinscricao = :numeroInscricao where id = :id ";
//        Query query = hibernateSession.createQuery(hql);
//        query.setLong("id", candidato.getId());
//        query.setLong("retornobb_id", retornoBB.getId());
//        query.setString("numeroInscricao" , numeroInscricao.toString());
//        int rowCount = query.executeUpdate();
//		if (rowCount == 0) {
//			log.info("Nenhum candidato");
//		} else {
//			log.info("Candidato: " + candidato.getId() );
//		}        
 
    }
    
    private void gravarArquivoBD(){
    	
    	entityManager.persist(retornoBB);
    	
    }

    // add additional action methods

    @Remove
    public void destroy() {}

	public RetornoBB getRetornoBB() {
		return retornoBB;
	}

	public void setRetornoBB(RetornoBB retornoBB) {
		this.retornoBB = retornoBB;
	}

}
